์คํ
์ด์ ์๊ฐ์ ์ผ๋ฐ ๋ฐฐ์ด๊ณผ ๋์ ๋ฐฐ์ด๋ก '์คํ'์ด๋ผ๋ ADT๋ฅผ ๊ตฌํํ๋ค.
๋งํฌ๋ ๋ฆฌ์คํธ๋ก ์คํ ๊ตฌํ
push : ๋งจ ์์ ํญ๋ชฉ์ ์ฝ์ ํ๋ ๊ฒ์ผ๋ก ๊ตฌํํ๋ค.
- ์ ๋ ธ๋๋ฅผ ๋ง๋ค๊ณ
- head์ ํฌ์ธํฐ์ ์๋ ์ฃผ์๊ฐ์ ๊ฐ์ ธ์ค๊ณ
- ์ ๋ ธ๋์ ํฌ์ธํฐ์ ๊ฐ์ ธ์จ ์ฃผ์๊ฐ์ ๋ฃ๊ณ
- ์์ ์ ์ฃผ์๊ฐ์ head์๊ฒ ๊ฐ๋ฆฌํค๊ฒ ํ๋ค.
pop : ์ฒซ ๋ ธ๋(header/top node)๋ฅผ ์ญ์ ํ๋๊ฒ์ผ๋ก ๊ตฌํํ๋ค.
- ์์ ๋ ธ๋๋ฅผ ๋ง๋ค๊ณ
- head๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ฐ์ ์์ ๋ ธ๋์ ํฌ์ธํฐ์ ํ ๋น.
- ํ ๋ ธ๋์ ๊ฐ๊ณผ ํ ๋ ธ๋์ ํฌ์ธํฐ์ ์๋ ์ฃผ์๊ฐ์ ๊ฐ์ ธ์จ๋ค.
- ํค๋ํฌ์ธํฐ๋ฅผ ํ๋ ธ๋์์ ๊ฐ์ ธ์จ ํฌ์ธํฐ๋ก ๋ฐ๊พธ๊ณ
- ์์ ๋ ธ๋๊ฐ ๊ฐ์ง๊ณ ์๋ ํ ๋ ธ๋์ ์ฃผ์๊ฐ์ free()ํด์ฃผ๊ณ
- 3๋ฒ์ ํ ๋ ธ๋ ์์ ์๋ ๊ฐ์ ๋ฐํ.
์ ์ฒด ์ญ์
์ด ๋ฐฉ๋ฒ์ ์ฌ์ค ๋งํฌ๋๋ฆฌ์คํธ๋ฅผ ์ญ์ ํ๋ ๋ฐฉ๋ฒ๊ณผ ๋์ผํ๋ค.
(์ ๋ฒ์๊ฐ์ ๋
ธํธ๋ฅผ ์ํด์ ์ฌ๊ธฐ๋ค๊ฐ ํจ)
- ์์ ํฌ์ธํฐ๋ฅผ ๋ง๋ค์ด ํ๋ ธ๋์ ์ฃผ์๊ฐ์ ๊ฐ์ ธ์ ๊ฐ๋ฆฌํค๊ฒ ํ๋ค.
- ํค๋ํฌ์ธํฐ๋ฅผ ๊ทธ ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๊ณ
- ์์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด free()ํด์ 1๋ฒ์์ ๊ฐ์ ธ์จ ํ๋ ธ๋๋ฅผ ์ง์ด๋ค
- ์ด ๊ณผ์ ์ ํค๋ํฌ์ธํฐ๊ฐ null์ผ๋ ๊น์ง.
void clearStack(Node **head_ptr) {
Node *head = *head_ptr;
Node *temp = NULL;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
*head_ptr = NULL;
}
ํ
์คํ์ด๋์ ๋ฐ๋๋ก ๋จผ์ ๋ค์ด๊ฐ๊ฒ์ด ๋จผ์ ๋์ค๋ ์๋ฃ๊ตฌ์กฐ.
FIFO - Fist In First Out.
push์ pop ๋์ EnQueue์ DeQueue๋ฅผ ์ฌ์ฉ.
push๊ฐ ๋งจ ์์ ๋ฃ๊ธฐ๋ผ๋ฉด, EnQueue๋ ๋งจ ๋ค์ ๋ฃ๊ธฐ.
pop๊ณผ DeQueue๋ ๋ชจ๋ ๋งจ ์์์ ์ ๊ฑฐํ๊ธฐ.
์ด๋ ์ด๋ก ๊ตฌํ
์ํ
์คํ์์๋ ๋ค์ด๊ฐ๋ ์ชฝ๊ณผ ๊บผ๋ด๋ ์ชฝ์ ๋ฐฉํฅ์ด ๋๊ฐ๋ค.
ํ์ง๋ง ํ๋ ๋ค์ด๊ฐ๋๊ฑด ๋ค์์ ๋ค์ด๊ฐ๊ณ , ๊บผ๋ผ๋๋ ์์์ ๊บผ๋ธ๋ค. ๋ฐฉํฅ์ด ๋ค๋ฅด๋ค.
๊ทธ๋์ ์ผ๋ฐ ์ด๋ ์ด๋ก ํ๋ฅผ ๊ตฌํํ๋ฉด, ๋ฐฐ์ด์ ์ ๊ณต๊ฐ์ด ๋ญ๋น๋ ์ ์๋ค. ๊ธธ์ด 5์ ์ด๋ ์ด [1,2,3,4,5]์์ 1๊ณผ 2๊ฐ ๋น ์ง๋ฉด [ , ,3,4,5]๊ฐ ๋๋ค.
์ธํ๋ ๋ค์์๋ถํฐ ๋ฃ๊ธฐ๋๋ฌธ์, ๋ค์ ๊ณต๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ๋์ด์ ๋ฃ์ ์ ์๊ฒ ๋๋ค(์์ ๋ ์๋ฆฌ๊ฐ ๋น์ด์์์๋ ๋ถ๊ตฌํ๊ณ ).
๊ทธ๋์ (๊ฐ๋ ์ ์ผ๋ก)์ ํ์ด ์๋ ์ํ์ธ ์ด๋ ์ด๋ฅผ ์ฌ์ฉํ๋ค.
์ด๊ฑธ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ front, rear ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์ฒ์์ ์ด๋ ์ด๋ฅผ ๋ง๋ค๋ front,rear ๋ชจ๋ -1์ผ๋ก ํ ๋นํ๋ค. (๋น์ด์์์ ๋ํ๋ด๊ธฐ ์ํด์)
์ธํ
์๋ฆฌ๋ ๊ฐ๋จํ๋ค. ํญ์ rear์ ์์์ ๊ฐ์ ๋ฃ๋๊ฒ.arr[rear] = var
.
- ์ผ๋จ ํ๊ฐ ๊ฝ ์ฐจ์๋์ง ํ์ธํ๋ค. (๋ฐฉ๋ฒ์ ๋ฐ์์)
rear = rear + 1
(๋ฐ์์ ๋ค์ ํ์ธ)- arr[rear] ์๋ฆฌ์ ๊ฐ์ ์ฝ์
๋ํ
์ ๊ฑฐํ ๋๋ ๋ฐ๋๋ก ํญ์ front์ ์์์์ ๊ฐ์ ์ ๊ฑฐํ๋๊ฒ.
- ์ผ๋จ ํ๊ฐ ๋น์ด์๋์ง ํ์ธํ๋ค. (๋ฐฉ๋ฒ์ ๋ฐ์์)
front = front +1;
(๋ฐ์์ ๋ค์ ํ์ธ)- arr[front]์ ์๋ ๊ฐ์ ๋ฐํ.
ํ๊ฐ ๊ฝ ์ฐจ์๋์ง, ๋น์ด์๋์ง ํ์ธ (๋ชจ๋๋ฌ)
๋ณดํต์ rear - front
๋ฅผ ํ๋ฉด ์ด๋ ์ด ์์ ๋ช๊ฐ์ ๊ฐ์ด ์๋์ง ํ์ธํ ์์๊ฒ ์ง๋ง,
๋ง์ฝ์ ํ๋ฐํด ์ด์ ๋์๊ฐ์ rear < front
์ธ ์ํฉ์์ ์ด๋ป๊ฒ ํ ๊น?
[5, ,2,3,4]
๊ฝ ์ฐจ์๋ ์ํฉ์์ rear๊ฐ 0์ด๊ณ front๊ฐ 2์ด๋ผ๊ณ ๊ฐ์ .
์ด์ ๋ค์ ์ฐจ๋ก๋๊น rear++๊ฐ ๋ผ์ rear๋ 1์ด ๋๊ณ , ์ฌ๊ธฐ์ ์ด๋ ์ด์ ํฌ๊ธฐ์ธ 5๋ฅผ ๋ํด์ 6-2 = 4 ๋๊น ๋น์ด์๋ ์๋ฆฌ๊ฐ ํ๋ ์๋๊ฑธ ์ ์ ์๋ค. ์ฆ rear % arr.length
๋ฅผ ํด์ ๊ฑฐ๊ธฐ์ front๋งํผ ๋นผ์ฃผ๋ฉด ๋๋๊ฒ.
์ ๋ฆฌํ์๋ฉด if((rear+1) % arr.length - front==0)
์ ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ํ๊ฐ ๊ฝ ์ฐจ์๋์ง ํ์ธํ ์ ์๋ค.
๊ทธ๋์ ์ฌ์ค ์์์ ์ธํ๊ณผ ๋ํ ๊ณผ์ ์์ rear,front๋ฅผ ์ฆ๊ฐ์ํฌ ๋ ๋ชจ๋๋ฌ ๊ณ์ฐ์ ๋ฃ์ด์ค์ผ ํ๋ค.
rear = (rear + 1) % arr.length
front = (front + 1) % arr.length
๋น์ด์๋์ง ํ์ธ์ ์ด๋ป๊ฒ ํ๋?
๋น์ด์๋ค๋๊ฑด front๊ฐ(๋ง์ง๋ง์ผ๋ก ๋ํํ ํ์ ์ธ๋ฑ์ค)์ด rear(๋ง์ง๋ง์ผ๋ก ์ธํํ ํ์ ์ธ๋ฑ์ค)๊ฐ ๊ฐ๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค.
๋น์ด์๋์ง ํ์ธ์ ๋ํํ๊ธฐ ์ ์ ํ๋๊ฒ์ด๋๊น [ , , ,1, ]
๋ฅผ ๋ํํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๋ง์ง๋ง ์ธํํ ํ์ rear๋ 3์ผ๊ฒ์ด๊ณ ,
๋ง์ง๋ง ๋ํํ ํ์ front๋ 2์ผ๊ฒ์ด๋ค.
rear != front์ด๋ ๋ํ ๊ณผ์ ์ ์งํํ ์ ์๋ค.
(front + 1 ) % 5
๋ฅผ ํ๋ฉด 3์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ 1์ ๋ฐํํ๊ณ ์ ๊ฑฐ.
์ด์ ๋ค์ ๋ ๋ํ๋ฅผ ์๋ํด๋ณด๋ฉด front == rear ๋ถ๊ฐ๋ฅํ๊ณ ์ค์ ๋ก ์ด๋ ์ด๋ ๋น์ด์๋ฐ.